// ============================== 导入依赖 ============================== //

import dayjs from 'dayjs'

const HISTORY = [
  { text: '今天', onClick: (p) => p.$emit('pick', [date(0, 1), date(0, 2)]) },
  { text: '昨天', onClick: (p) => p.$emit('pick', [date(-1, 1), date(-1, 2)]) },
  { text: '前天', onClick: (p) => p.$emit('pick', [date(-2, 1), date(-2, 2)]) },
  { text: '本周', onClick: (p) => p.$emit('pick', [week(0, 1), date(0, 2)]) },
  { text: '上周', onClick: (p) => p.$emit('pick', [week(-1, 1), week(-1, 2)]) },
  { text: '本月', onClick: (p) => p.$emit('pick', [month(0, 1), date(0, 2)]) },
  { text: '上月', onClick: (p) => p.$emit('pick', [month(-1, 1), month(-1, 2)]) },
  { text: '一周内', onClick: (p) => p.$emit('pick', [week(-1, 3), date(0, 2)]) },
  { text: '一月内', onClick: (p) => p.$emit('pick', [month(-1, 3), date(0, 2)]) },
]
const FUTURE = [
  { text: '今天', onClick: (p) => p.$emit('pick', [date(0, 1), date(0, 2)]) },
  { text: '明天', onClick: (p) => p.$emit('pick', [date(1, 1), date(1, 2)]) },
  { text: '后天', onClick: (p) => p.$emit('pick', [date(2, 1), date(2, 2)]) },
  { text: '本周', onClick: (p) => p.$emit('pick', [date(0, 1), week(0, 2)]) },
  { text: '下周', onClick: (p) => p.$emit('pick', [week(1, 1), week(1, 2)]) },
  { text: '本月', onClick: (p) => p.$emit('pick', [date(0, 1), month(0, 2)]) },
  { text: '下月', onClick: (p) => p.$emit('pick', [month(1, 1), month(1, 2)]) },
  { text: '一周内', onClick: (p) => p.$emit('pick', [date(0, 1), week(1, 4)]) },
  { text: '一月内', onClick: (p) => p.$emit('pick', [date(0, 1), month(1, 4)]) },
]
const ALL = [
  { text: '今天', onClick: (p) => p.$emit('pick', [date(0, 1), date(0, 2)]) },
  { text: '昨天', onClick: (p) => p.$emit('pick', [date(-1, 1), date(-1, 2)]) },
  { text: '明天', onClick: (p) => p.$emit('pick', [date(1, 1), date(1, 2)]) },
  { text: '本周', onClick: (p) => p.$emit('pick', [week(0, 1), week(0, 2)]) },
  { text: '上周', onClick: (p) => p.$emit('pick', [week(-1, 1), week(-1, 2)]) },
  { text: '下周', onClick: (p) => p.$emit('pick', [week(1, 1), week(1, 2)]) },
  { text: '本月', onClick: (p) => p.$emit('pick', [month(0, 1), month(0, 2)]) },
  { text: '上月', onClick: (p) => p.$emit('pick', [month(-1, 1), month(-1, 2)]) },
  { text: '下月', onClick: (p) => p.$emit('pick', [month(1, 1), month(1, 2)]) },
]

// ============================== 导出表单日期范围 ============================== //

export default {
  // —————————————————————————————— 公共覆盖 —————————————————————————————— //

  // 若为逗号分隔的 'date1, date2'，则 one.date1 和 one.date2 为时间戳
  // 若为无逗号的 'dates'，则 one.dates 为 [时间戳, 时间戳]
  bind: { type: [Array, String], default: () => ['date1', 'date2'] }, // 绑定键名，触发 @change 事件

  // 示例 '创建开始日期，创建结束日期'
  // 示例 '创建日期' (等价于 '创建日期，创建日期')
  tip: { type: String, default: null }, // placeholder 提示 (以中文逗号或英文逗号分隔)

  // —————————————————————————————— 私有属性 —————————————————————————————— //

  and: { type: String, default: ' 至 ' }, // 连接符号
  weekFirst: { type: Number, default: 1 }, // 每周第一天 (0 周日，1 周一，6 周六)

  format: { type: Boolean, default: false }, // 是否为 yyyy-MM-dd 串
  string: { type: Boolean, default: false }, // 是否为字符串类型的时间戳

  history: { type: Boolean, default: false }, // 是否为历史
  future: { type: Boolean, default: false }, // 是否为将来

  noQuick: { type: Boolean, default: false }, // 有无快捷选项
  quickHistory: { type: Array, default: () => HISTORY }, // 历史快捷选项
  quickFuture: { type: Array, default: () => FUTURE }, // 未来快捷选项
  quickAll: { type: Array, default: () => ALL }, // 全部快捷选项
}

// ============================== 内部方法 ============================== //

/**
 * 获取日期
 *
 * num=-1, type=1 昨天开始 00:00:00
 * num=-1, type=2 昨天结束 23:59:59
 * num=-1, type=undefined 昨天开始 00:00:00
 */
export const date = (num, type) => {
  let day = dayjs().add(num, 'day').startOf('day')
  if (type === 2) day = day.endOf('day')
  return new Date(day.startOf('second').valueOf())
}

/**
 * 获取星期
 *
 * num=-1 相同星期几的一周前 00:00:00
 * num=-1, type=1 上周一开始 00:00:00
 * num=-1, type=2 上周日结束 23:59:59
 * num=-1, type=3 包含今天在内的一周前开始 00:00:00
 * num=-1, type=4 包含今天在内的一周前结束 23:59:59
 */
export const week = (num, type) => {
  let day = dayjs().add(num, 'week').startOf('day')
  if (type === 1) day = day.startOf('week').add(1, 'day')
  else if (type === 2) day = day.endOf('week').add(1, 'day')
  else if (type === 3) day = day.add(1, 'day')
  else if (type === 4) day = day.subtract(1, 'day').endOf('day')
  return new Date(day.startOf('second').valueOf())
}

/**
 * 获取月份
 *
 * num=-1 相同几号的一月前 00:00:00
 * num=-1, type=1 上月 1 号开始 00:00:00
 * num=-1, type=2 上月最后一天结束 23:59:59
 * num=-1, type=3 包含今天在内的一月前开始 00:00:00
 * num=-1, type=4 包含今天在内的一月前结束 23:59:59
 */
export const month = (num, type) => {
  let day = dayjs().add(num, 'month').startOf('day')
  if (type === 1) day = day.startOf('month')
  else if (type === 2) day = day.endOf('month')
  else if (type === 3) day = day.add(1, 'day')
  else if (type === 4) day = day.subtract(1, 'day').endOf('day')
  return new Date(day.startOf('second').valueOf())
}
